package com.mengxj;

import com.common.lambda.Animal;

/**
 * 有一个Animal接口，接口有唯一的抽象方法info。
 * 下面，实现调用animal输出‘this is a dog’
 * @author mengxj
 */
public class LambdaTest {

    public static void main(String[] args) {
        method1();
        method2();
        method3();
        method4();
    }

    /**
     * 实现方式1，写个实现类，继承接口，重写方法。
     */
    static void method1(){
        Dog dog = new Dog();
        dog.info();
    }

    /**
     * 实现方式2，写个匿名内部类，重写方法
     * 匿名内部类是没有名的子类
     */
    static void method2(){
        Animal animal = new Animal() {
            @Override
            public void info() {
                System.out.println("this is a dog");
            }
        };
        animal.info();
    }

    /**
     * 实现方式3，在实现方式2基础上，化简
     * 化简a，在方法()前到等号之间删除，()后面加一个->
     * 化简b，步骤a会多删除一个{括号，所以再把对应的}删除即可
     */
    static void method3(){
        Animal animal = () -> {
            System.out.println("this is a dog");
        };
        animal.info();
    }

    /**
     * 实现方式4，在实现方式3基础上，化简
     * 化简a，当{}里面只有一句话，{}可以省略
     */
    static void method4(){
        Animal animal = () -> System.out.println("this is a dog");
        animal.info();
    }
}
class Dog implements Animal{

    @Override
    public void info() {
        System.out.println("this is a dog");
    }
}
